package cn.zqy.demo2.day12FunctionalInterface.Predicate;

import java.util.function.Predicate;

/*
    逻辑表达式:可以连接多个判断的条件
    &&:与运算符,有false则false
    ||:或运算符,有true则true
    !:非(取反)运算符,非真则假,非假则真

    需求:判断一个字符串,有两个判断的条件
        1.判断字符串的长度是否大于5
        2.判断字符串中是否包含a
    两个条件必须同时满足,我们就可以使用&&运算符连接两个条件

    Predicate接口中有一个方法and,表示并且关系,也可以用于连接两个判断条件
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> this.test(t) && other.test(t);
    }
    方法内部的两个判断条件,也是使用&&运算符连接起来的
 */

public class Demo02PredicateAnd {
    /*
           定义一个方法,方法的参数,传递一个字符串
           传递两个Predicate接口
               一个用于判断字符串的长度是否小于10
               一个用于判断字符串中是否包含5
               两个条件必须同时满足
        */
    public static boolean checkBool(String name, Predicate<String> str1, Predicate<String> str2) {
        // return str1.test(name) && str2.test(name);
        return str1.and(str2).test(name);  // 等价于上面
    }

    public static void main(String[] args) {
        String s = "abcdef";
        //调用checkBool方法对字符串进行校验,参数传递字符串和Lambda表达式
        boolean isCkeck = checkBool(s, (String str) -> {
            // 判断字符串的长度是否小于10
            return str.length() < 10;
        }, (String str) -> {
            //  一个用于判断字符串中是否包含5
            return str.contains("5");
        });
        System.out.println(isCkeck);
    }
}
